package com.wy._05Random.randomFile.randomPic;

import com.wy._05Random.RandomCharacter;
import com.wy._05Random.bean.Background;
import com.wy._05Random.bean.ImageObj;
import com.wy._05Random.randomFile.Enum.FileType;
import com.wy._05Random.randomFile.Enum.FontEnum;
import com.wy._05Random.randomFile.LocalGraphicsEnvironment;
import com.wy._05Random.randomFile.Utils;
import com.wy._05Random.randomFile.randomPic.backgroundImpl.ColorfulBlack;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.Buffer;
import java.util.Random;

//生成随机图片，应该写一个很强大的方法，里面可以传递图片格式，图片大小，图片复杂度，图片分辨率，等等，其他 的方法就可以调用这个方法  复杂


//控制文件大小还是没有一个好的思路：
// 可以从 图像宽高，主要是分辨路，  或者说搞一个复杂的背景？？ 到时候直接上。
// 写字儿 多少，大小，字体样式
// 图形 各种图形。  大小。不实心， 随机性。随机线条的话可能好点吧，不容易被压缩、  随机线条、
// 不要考虑。io的效率。画成什么写什么，那是机器速度的问题。

// TODO: 先不考虑了，没有一个好的解决方案。 复杂度的话就按照，循环的次数来决定吧， 如果没有设置 图片大小的话按照需要的图片大小设置 图片初始分辨率。
public class RandomPic {

    /**
     * 生成一个图片，关于图片的信息都需要填写。并非随机。其他需要随机生成的调用这个API。
     *
     * @param width     图片的宽度
     * @param height    图片的高度
     * @param imageSize 图片的大小，单位(byte)
     * @param imageType 图片的文件格式
     * @return 生成图片
     */
    //传入一个复杂度，不同的 可以根据这个值给 里面的写字儿，线条等一个比例。！！
    public static BufferedImage handle(int width, int height, int imageSize, Color backgroundColor, FileType.ImageType imageType) throws IOException {
        Random random = new Random();
        // 初始化图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();

        // 设置随机背景色 首先设置颜色，之后设置矩形
        g2d.setColor(backgroundColor);
        g2d.fillRect(0, 0, width, height);
        g2d.dispose();

        // 尝试写入到ByteArrayOutputStream以测量大小
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        while (true) {
            // 写入图片到ByteArrayOutputStream
            ImageIO.write(image, imageType.getTypeName(), baos);
            byte[] imageBytes = baos.toByteArray();

            if (imageBytes.length >= imageSize) {
                // 如果达到，则写入到文件并退出循环
                return image;
            } else {
                // 如果没有达到，则继续增加图片元素
                addRandomElementsToImage(image, random);
                //重置byteArray，为了下一次写入不受影响
                baos.reset();
            }
        }
    }

    /**
     * 写入本地一张图片
     *
     * @param location 本地磁盘路径
     * @param fileName 文件名字
     * @param random   随机对象
     * @return 返回是否写入成功
     * @throws IOException io异常
     */
    public static boolean createImg(String location, String fileName, FileType.ImageType imageType, Random random) throws IOException {

        if (!new File(location).isDirectory()) {
            throw new RuntimeException("目录不存在");
        }
        BufferedImage randomImage = getRandomImagesOfByte(random);
        return ImageIO.write(randomImage, imageType.getTypeName(), new File(location + "/" + fileName));
    }

    //得到随机图片的byte数组
    // 像这种啥也不指定的，直接循环次数给特别少。
    public static BufferedImage getRandomImagesOfByte(Random random) throws IOException {
        return handle(400, 300, 50 * 1024, Utils.getRandomColor(random), FileType.ImageType.JPG);
    }

    /**
     * 给原始图片添加内容
     *
     * @param image  原始图片
     * @param random 随机对象
     */
    private static void addRandomElementsToImage(BufferedImage image, Random random) {
        Graphics2D g2d = image.createGraphics();
        // 添加多个随机文本
        for (int i = 0; i < 20; i++) {
            g2d.setFont(Utils.getRandomFont(random));
            g2d.setColor(Utils.getRandomColor(random));
            String randomText = RandomCharacter.getRandomStrEnCnNu(3, random, false);
            g2d.drawString(randomText, random.nextInt(image.getWidth()), random.nextInt(image.getHeight()));
        }

        // 绘制随机线条
        for (int i = 0; i < 20; i++) {
            g2d.setColor(Utils.getRandomColor(random));
            g2d.drawLine(random.nextInt(image.getWidth()), random.nextInt(image.getHeight()), random.nextInt(image.getWidth()), random.nextInt(image.getHeight()));
        }

        // 绘制随机形状
        for (int i = 0; i < 20; i++) {
            g2d.setColor(Utils.getRandomColor(random));
            int shapeType = random.nextInt(3);
            int x = random.nextInt(image.getWidth());
            int y = random.nextInt(image.getHeight());
            int size = random.nextInt(50);
            switch (shapeType) {
                case 0: // 圆形
                    g2d.fillOval(x, y, size, size);
                    break;
                case 1: // 矩形
                    g2d.fillRect(x, y, size, size);
                    break;
                case 2: // 椭圆形
                    g2d.fillOval(x, y, size, size);
                    break;
            }
        }
        g2d.dispose();
    }

    /**
     * 给原始图片添加一个随机的圆
     *
     * @param originalBufferedImage 原始图片对象
     * @return 返回添加图片后的新图片
     */
    private static BufferedImage addRandomCircle(BufferedImage originalBufferedImage) {
        return originalBufferedImage;
    }

    /**
     * 给原始图片添加一个随机椭圆
     *
     * @param originalBufferedImage 原始图片对象
     * @return 返回添加图片后的新图片
     */
    private static BufferedImage addRandomEllipse(BufferedImage originalBufferedImage) {
        return originalBufferedImage;
    }

    /**
     * 给原始图片添加一个随机正方形
     *
     * @param originalBufferedImage 原始图片对象
     * @return 返回添加图片后的新图片
     */
    private static BufferedImage addRandomSquare(BufferedImage originalBufferedImage) {
        return originalBufferedImage;
    }

    /**
     * 添加随机的形状，
     * @return
     */
    private static BufferedImage addRandomShape(){
       return null;
    }

    /**
     * 给原始图片添加一个随机线条
     *
     * @param originalBufferedImage 原始图片对象
     * @param pointNum              线条的点数
     * @return 返回添加图片后的新图片
     */
    private static BufferedImage addRandomLine(BufferedImage originalBufferedImage, int pointNum) {
        return originalBufferedImage;
    }

    /**
     * 得到初始的背景 图片
     * @return
     */
    private static Background getBackground(){
        return null;
    }

    private static ImageObj handle(){
//        ColorfulBlack colorfulBlack = new ColorfulBlack();
//        ImageObj imageObj = new ImageObj();
//        Background background = getBackground();
//        imageObj.setBackground(colorfulBlack);
//        imageObj.add
//        imageObj.addSqure();
//        return ImageObj;
        return null;
    }

//  我记得有一个  关于图形的对象，人家本身就是有的，这个  也可以写一个枚举或者 或者方法 ，这些图形，就可以很简单的加上去了。  可以搜一下 应该有包或者  写好的现成的，
}
